//=============================================================================
/**
 * @file	opd_scene5.c
 * @brief	オープニングデモシーン5	スイクン崖
 * @author	Nozomu Saito
 * @date    2009.03.20
 */
//=============================================================================

#include "opening_demo_local.h"
#include "opd_scene5.h"

#include "system/wipe.h"
#include "system/arc_tool.h"
#include "system/clact_tool.h"		//for REND_OAMTrans
#include "op_demo.naix"

#include "opd_def.h"

#define DISP_DISTANCE	(256)

//シーン5		スイクン崖
#define MAIN_BACK1_FRAME		(GF_BGL_FRAME1_M)
#define MAIN_BACK2_FRAME		(GF_BGL_FRAME2_M)

#define SUB_BACK1_FRAME			(GF_BGL_FRAME1_S)
#define SUB_BACK2_FRAME			(GF_BGL_FRAME2_S)

#define BACK_BG_OFS				( ((512-192)/2) )

static void VBlanikFunc(void* work);

static void Scene5BgSet(OPD_WK_PTR wk);
static void Scene5GraLoad(GF_BGL_INI *bgl, SCENE5_WORK *scene);
static void Scene5_Init(OPD_WK_PTR wk, SCENE5_WORK *scene);
static void SetScene5Start(SCENE5_WORK *scene, GF_BGL_INI *bgl);
static BOOL Scene5_Main(OPD_WK_PTR wk, SCENE5_WORK *scene, const int inCounter);
static void Scene5_End(OPD_WK_PTR wk, SCENE5_WORK *scene);

static void InitAct(OPD_WK_PTR wk, SCENE5_WORK *scene);
static void EndAct(OPD_WK_PTR wk, SCENE5_WORK *scene);
static void SetActor( OPD_WK_PTR wk, SCENE5_WORK *scene );

//リソースマネージャー登録数テーブル
static const u8 ResEntryNumTbl[RESOURCE_NUM] = {
	1,			//キャラリソース
	1,			//パレットリソース
	1,			//セルリソース
	1,			//セルアニメリソース
};

//--------------------------------------------------------------------------------------------
/**
 * シーンメイン関数
 *
 * @param	wk			ワーク
 * @param	sc_wk		シーンワークポインタ
 *
 * @return	BOOL		TRUEで終了
 */
//--------------------------------------------------------------------------------------------
BOOL OPD_Scene5(OPD_WK_PTR wk, void *sc_wk)
{
	SCENE5_WORK *scene = (SCENE5_WORK *)sc_wk;
	u8 *seq = &(scene->Seq);

	if (OPD_GetSkipFlg(wk)){
		(*seq) = 2;		//スキップ実行
	}

	switch(*seq){
	case 0:		//初期化・グラフィックロード
		Scene5_Init(wk, scene);
		(*seq)++;
		break;
	case 1:			//メイン
		if ( Scene5_Main( wk, scene, OPD_GetFrmCounter(wk) ) ){
			(*seq)++;
		}
		break;
	case 2:			//終了
		Scene5_End(wk, scene);

		return TRUE;
	}
	return FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * ＶＢＬＡＮＫ関数
 *
 * @param	work			ワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void VBlankFunc(void* work)
{

	OPD_WK_PTR wk = work;
	GF_BGL_VBlankFunc( OPD_GetBGL(wk) );

	// レンダラ共有OAMマネージャVram転送
	REND_OAMTrans();
}

//--------------------------------------------------------------------------------------------
/**
 * シーン初期化
 *
 * @param	wk			ワーク
 * @param	scene		シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene5_Init(OPD_WK_PTR wk, SCENE5_WORK *scene)
{
	GF_BGL_INI *bgl;
	bgl = OPD_GetBGL(wk);

	//３Ｄ描画スイッチ(下画面がメイン)
	sys.disp3DSW = DISP_3D_TO_SUB;
	GF_Disp_DispSelect();

	//マスター輝度を下げておく
	WIPE_SetBrightness( WIPE_DISP_MAIN,WIPE_FADE_BLACK );
	WIPE_SetBrightness( WIPE_DISP_SUB,WIPE_FADE_BLACK );

///	SetVramBank();		//Vバンクセット

	Scene5BgSet(wk);
	OPD_ResetDispEff(wk);

	sys_VBlankFuncChange(VBlankFunc,(void*)wk);

	//グラフィックロード
	Scene5GraLoad(bgl, scene);

	//上下画面の距離をセット
	OPD_SetDispDistance( wk, 0, 0, 0, DISP_DISTANCE );

	//アクター
	InitAct(wk, scene);
	SetActor( wk, scene );

	SetScene5Start(scene, bgl);

	scene->InitOK = 1;	//init通過
}

//--------------------------------------------------------------------------------------------
/**
 * シーン再生メイン
 *
 * @param	wk			ワーク
 * @param	scene		シーンワーク
 * @param	inCounter	カウンタ
 *
 * @return	BOOL 		TRUEで終了
 */
//--------------------------------------------------------------------------------------------
static BOOL Scene5_Main(OPD_WK_PTR wk, SCENE5_WORK *scene, const int inCounter)
{
	u8 count;
	DISP_EFF_WORK *dew;
	GF_BGL_INI *bgl = OPD_GetBGL(wk);
	dew = GetDispEffWorkAdr(wk);
	count = OPD_GetSceneCount(wk);

	switch( OPD_GetSceneSeq(wk) ){
	case 0:			//ワイプ
		//ワイプインスタート
		WIPE_SYS_Start(	WIPE_PATTERN_FMAS, WIPE_TYPE_SPLITIN_VCENTER,
							WIPE_TYPE_SHUTTERIN_UP,WIPE_FADE_BLACK,S5_WIPE_IN_SYNC,1,HEAPID_OP_DEMO );
		OPD_IncSceneSeq(wk);	//シーケンスシフト
		break;
	case 1:			//ワイプ待ち
		if ( WIPE_SYS_EndCheck() ){
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case 2:			//BGスクロール開始
		if (PM_VERSION == VERSION_GOLD){
			OPD_ReqScroll( bgl, &dew->ScrlMng, MAIN_BACK1_FRAME,
							0, -S5_GL_MAINBG1_SCROLL, S5_GL_MAIN_BG_SCROLL_SYNC );
			OPD_ReqScroll( bgl, &dew->ScrlMng, MAIN_BACK2_FRAME,
							0, -S5_GL_MAINBG2_SCROLL, S5_GL_MAIN_BG_SCROLL_SYNC );
			OPD_ReqScroll( bgl, &dew->ScrlMng, SUB_BACK1_FRAME,
							0, -S5_GL_SUBBG1_SCROLL, S5_GL_SUB_BG_SCROLL_SYNC );
			OPD_ReqScroll( bgl, &dew->ScrlMng, SUB_BACK2_FRAME,
							0, -S5_GL_SUBBG2_SCROLL, S5_GL_SUB_BG_SCROLL_SYNC );
		}else{
			OPD_ReqScroll( bgl, &dew->ScrlMng, MAIN_BACK1_FRAME,
							0, -S5_SL_MAINBG1_SCROLL, S5_SL_MAIN_BG_SCROLL_SYNC );
			OPD_ReqScroll( bgl, &dew->ScrlMng, MAIN_BACK2_FRAME,
							0, -S5_SL_MAINBG2_SCROLL, S5_SL_MAIN_BG_SCROLL_SYNC );
			OPD_ReqScroll( bgl, &dew->ScrlMng, SUB_BACK1_FRAME,
							0, -S5_SL_SUBBG1_SCROLL, S5_SL_SUB_BG_SCROLL_SYNC );
			OPD_ReqScroll( bgl, &dew->ScrlMng, SUB_BACK2_FRAME,
							0, -S5_SL_SUBBG2_SCROLL, S5_SL_SUB_BG_SCROLL_SYNC );
		}
		OPD_IncSceneSeq(wk);	//シーケンスシフト
		break;
	case 3:		//ホワイトアウト開始
		if (count >= S5_CONT_WHITE_OUT_START){
			WIPE_SYS_Start(	WIPE_PATTERN_WMS, WIPE_TYPE_FADEOUT,
								WIPE_TYPE_FADEOUT,WIPE_FADE_WHITE,S5_WHITE_OUT_SYNC,1,HEAPID_OP_DEMO );
			OPD_IncSceneSeq(wk);	//シーケンスシフト
		}
		break;
	case 4:
		if ( WIPE_SYS_EndCheck() ){
			return TRUE;
		}
		break;
	}
	return FALSE;
}

//--------------------------------------------------------------------------------------------
/**
 * シーン終了
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene5_End(OPD_WK_PTR wk, SCENE5_WORK *scene)
{
	u8 i;
	GF_BGL_INI *bgl;
	bgl = OPD_GetBGL(wk);
	sys_VBlankFuncChange( NULL, NULL );	// VBlankセット

	if (scene->InitOK){
		//アクター解放
		EndAct(wk, scene);
		//ＢＧＬ解放
		GF_BGL_BGControlExit( bgl, MAIN_BACK1_FRAME );
		GF_BGL_BGControlExit( bgl, MAIN_BACK2_FRAME );
		GF_BGL_BGControlExit( bgl, SUB_BACK1_FRAME );
		GF_BGL_BGControlExit( bgl, SUB_BACK2_FRAME );
		scene->InitOK = 0;
	}
}

//--------------------------------------------------------------------------------------------
/**
 * BGセット
 *
 * @param	wk		OBJワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene5BgSet(OPD_WK_PTR wk)
{
	GF_BGL_INI *bgl;
	bgl = OPD_GetBGL(wk);

	{	// BGシステム設定
		GF_BGL_SYS_HEADER BGsys_data = {
			GX_DISPMODE_GRAPHICS,GX_BGMODE_0,GX_BGMODE_0,GX_BG0_AS_2D
		};
		GF_BGL_InitBG( &BGsys_data );
	}

	//--メイン--		下画面
	{	// ＢＧ設定(メイン1)
		GF_BGL_BGCNT_HEADER MBG1_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x0000, GX_BG_CHARBASE_0x04000,		//キャラベースは同じ
			GX_BG_EXTPLTT_01, 1, 0, 0, FALSE			//プライオリティ1
		};
		GF_BGL_BGControlSet( bgl, MAIN_BACK1_FRAME, &MBG1_Data, GF_BGL_MODE_TEXT );
	}
	{	// ＢＧ設定(メイン2)
		GF_BGL_BGCNT_HEADER MBG2_Data = {
			0, 0, 0x1000, 0,
			GF_BGL_SCRSIZ_256x512, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x0800, GX_BG_CHARBASE_0x04000,		//キャラベースは同じ
			GX_BG_EXTPLTT_01, 2, 0, 0, FALSE			//プライオリティ2
		};
		GF_BGL_BGControlSet( bgl, MAIN_BACK2_FRAME, &MBG2_Data, GF_BGL_MODE_TEXT );
	}

	//--サブ--		上画面
	{	// ＢＧ設定(サブ1)
		GF_BGL_BGCNT_HEADER SBG1_Data = {
			0, 0, 0x800, 0,
			GF_BGL_SCRSIZ_256x256, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x0000, GX_BG_CHARBASE_0x04000,		//キャラベースは同じ
			GX_BG_EXTPLTT_01, 1, 0, 0, FALSE			//プライオリティ1
		};
		GF_BGL_BGControlSet( bgl, SUB_BACK1_FRAME, &SBG1_Data, GF_BGL_MODE_TEXT );
	}
	{	// ＢＧ設定(サブ2)
		GF_BGL_BGCNT_HEADER SBG2_Data = {
			0, 0, 0x1000, 0,
			GF_BGL_SCRSIZ_256x512, GX_BG_COLORMODE_16,
			GX_BG_SCRBASE_0x0800, GX_BG_CHARBASE_0x04000,		//キャラベースは同じ
			GX_BG_EXTPLTT_01, 2, 0, 0, FALSE			//プライオリティ2
		};
		GF_BGL_BGControlSet( bgl, SUB_BACK2_FRAME, &SBG2_Data, GF_BGL_MODE_TEXT );
	}
}

//--------------------------------------------------------------------------------------------
/**
 * BGロード
 *
 * @param	bgl		BGL
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void Scene5GraLoad(GF_BGL_INI *bgl, SCENE5_WORK *scene)
{
	//キャラ
	ArcUtil_BgCharSet(ARC_OP_DEMO, NARC_op_demo_demo_lust_u_lz_ccgr,
						bgl, SUB_BACK1_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	ArcUtil_BgCharSet(ARC_OP_DEMO, NARC_op_demo_demo_lust_d_lz_ccgr,
						bgl, MAIN_BACK1_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	//スクリーン
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_lust2_u_lz_cscr,
						bgl, SUB_BACK1_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_lust1_u_lz_cscr,
						bgl, SUB_BACK2_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_lust1_d_lz_cscr,
						bgl, MAIN_BACK1_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);
	ArcUtil_ScrnSet(ARC_OP_DEMO, NARC_op_demo_demo_lust2_d_lz_cscr,
						bgl, MAIN_BACK2_FRAME, 0, 0, TRUE, HEAPID_OP_DEMO);

	//パレット
	ArcUtil_PalSet( ARC_OP_DEMO, NARC_op_demo_demo_bg_d_nclr,
						PALTYPE_MAIN_BG, 0, PAL_ONE_SIZE*16*16, HEAPID_OP_DEMO );	//メイン　0番に16色16本ロード
	ArcUtil_PalSet( ARC_OP_DEMO, NARC_op_demo_demo_bg_u_nclr,
						PALTYPE_SUB_BG, 0, PAL_ONE_SIZE*16*16, HEAPID_OP_DEMO );		//サブ　0番に16色16本ロード

	//--初期ＢＧ設定
	//BG0・上下画面ゲーフリロゴ非表示
///	GF_Disp_GX_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
///	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_BG2, VISIBLE_OFF );
	//ベース背景とコピーライトをブレンド
///	G2_SetBlendAlpha( BLD_MASK_COPY_LIGHT, BLD_MASK_BACK_BASE_M, 0, 16);

	OS_WaitIrq(TRUE, OS_IE_V_BLANK); 	// Ｖブランク待ち
	//マスター輝度を戻す
///	WIPE_ResetBrightness( WIPE_DISP_MAIN );
///	WIPE_ResetBrightness( WIPE_DISP_SUB );

	GF_Disp_DispOn();
}

//--------------------------------------------------------------------------------------------
/**
 * シーン開始前セットアップ
 *
 * @param	scene		シーンワーク
 * @param	bgl			BGL
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void SetScene5Start(SCENE5_WORK *scene, GF_BGL_INI *bgl)
{
	//アクター初期状態セット
	{
	}
	//ＢＧ初期状態セット
	{
		//スクロールオフセット設定
		GF_BGL_ScrollSet( bgl, MAIN_BACK2_FRAME, GF_BGL_SCROLL_Y_SET, BACK_BG_OFS );
		GF_BGL_ScrollSet( bgl, SUB_BACK2_FRAME, GF_BGL_SCROLL_Y_SET, BACK_BG_OFS );
	}
/**
	GF_BGL_BackGroundColorSet( GF_BGL_FRAME0_M, 0x0000 );	//背景色初期化（メイン画面）
	GF_BGL_BackGroundColorSet( GF_BGL_FRAME0_S, 0x0000 );	//背景色初期化（サブ画面）
*/
}

/////////////////////////////////////
//セルアクター

//--------------------------------------------------------------------------------------------
/**
 * セルアクター初期化
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void InitAct(OPD_WK_PTR wk, SCENE5_WORK *scene)
{
#if 0
	u8 i;
	const int heapid = HEAPID_OP_DEMO;
	CLACT_U_RES_MANAGER_PTR *res_man;
	//リソースマネージャー初期化
	OPD_InitResMan(wk, ResEntryNumTbl);

	res_man = OPD_GetResManPtr(wk);

	//--ライバルシーン--
	//--chara読み込み
	scene->ResObjTbl[0][CLACT_U_CHAR_RES] = CLACT_U_ResManagerResAddArcChar(
			 							res_man[CLACT_U_CHAR_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_rival_u_lz_ccgr,
										TRUE, ACT_ID_S3_RIVAL, NNS_G2D_VRAM_TYPE_2DSUB, heapid);
	//--pal読み込み
	scene->ResObjTbl[0][CLACT_U_PLTT_RES] = CLACT_U_ResManagerResAddArcPltt(
										res_man[CLACT_U_PLTT_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_rival_u_nclr,
										FALSE, ACT_ID_S3_RIVAL, NNS_G2D_VRAM_TYPE_2DSUB,
										S3_ACT_RIVAL_PALETTE_NUM, heapid);
	//--cell読み込み
	scene->ResObjTbl[0][CLACT_U_CELL_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELL_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_rival_u_lz_ccer,
										TRUE, ACT_ID_S3_RIVAL, CLACT_U_CELL_RES, heapid);
	//--同じ関数でanim読み込み
	scene->ResObjTbl[0][CLACT_U_CELLANM_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELLANM_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_rival_u_lz_canr,
										TRUE, ACT_ID_S3_RIVAL, CLACT_U_CELLANM_RES, heapid);

	//--伝説ポケ3匹シーン--
	//--chara読み込み
	scene->ResObjTbl[1][CLACT_U_CHAR_RES] = CLACT_U_ResManagerResAddArcChar(
			 							res_man[CLACT_U_CHAR_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_ensuirai_d_lz_ccgr,
										TRUE, ACT_ID_S3_MINA_ANN, NNS_G2D_VRAM_TYPE_2DSUB, heapid);
	//--pal読み込み
	scene->ResObjTbl[1][CLACT_U_PLTT_RES] = CLACT_U_ResManagerResAddArcPltt(
										res_man[CLACT_U_PLTT_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_ensuirai_d_nclr,
										FALSE, ACT_ID_S3_MINA_ANN, NNS_G2D_VRAM_TYPE_2DSUB,
										S3_ACT_MINA_ANN_PALETTE_NUM, heapid);
	//--cell読み込み
	scene->ResObjTbl[1][CLACT_U_CELL_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELL_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_ensuirai_d_lz_ccer,
										TRUE, ACT_ID_S3_MINA_ANN, CLACT_U_CELL_RES, heapid);
	//--同じ関数でanim読み込み
	scene->ResObjTbl[1][CLACT_U_CELLANM_RES] = CLACT_U_ResManagerResAddArcKindCell(
										res_man[CLACT_U_CELLANM_RES],
										ARC_OP_DEMO, NARC_op_demo_demo_obj_ensuirai_d_lz_canr,
										TRUE, ACT_ID_S3_MINA_ANN, CLACT_U_CELLANM_RES, heapid);
	// リソースマネージャーから転送
	for (i=0;i<2;i++){
		// Chara転送
		CLACT_U_CharManagerSet( scene->ResObjTbl[i][CLACT_U_CHAR_RES] );
		// パレット転送
		CLACT_U_PlttManagerSet( scene->ResObjTbl[i][CLACT_U_PLTT_RES] );
	}

	GF_Disp_GXS_VisibleControl( GX_PLANEMASK_OBJ, VISIBLE_ON );		// SUB DISP OBJ ON
#endif
}

//--------------------------------------------------------------------------------------------
/**
 * セルアクター終了
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//--------------------------------------------------------------------------------------------
static void EndAct(OPD_WK_PTR wk, SCENE5_WORK *scene)
{
#if 0
	u8 i;
	//アクター削除

	// キャラ転送マネージャー破棄
	CLACT_U_CharManagerDelete(scene->ResObjTbl[CLACT_U_CHAR_RES]);
	// パレット転送マネージャー破棄
	CLACT_U_PlttManagerDelete(scene->ResObjTbl[CLACT_U_PLTT_RES]);
	// キャラ・パレット・セル・セルアニメのリソースマネージャー破棄
	OPD_DelResMan(wk);
#endif
}

//--------------------------------------------------------------------------------------------
/**
 * セルアクターをセット
 *
 * @param	wk		ワーク
 * @param	scene	シーンワーク
 *
 * @return	none
 */
//-------------------------------------------------------------------------------------------
static void SetActor( OPD_WK_PTR wk, SCENE5_WORK *scene )
{
#if 0
	int i;
	CLACT_HEADER			cl_act_header;
	CLACT_ADD add;

	//ライバル
	OPD_MakeClActHeader( ACT_ID_S3_RIVAL, wk, 0, NNS_G2D_VRAM_TYPE_2DSUB, &add, &cl_act_header );
	add.mat.x = FX32_ONE * RIVAL_DEF_POS_X;
	add.mat.y = FX32_ONE * RIVAL_DEF_POS_Y;
	scene->Rival = CLACT_Add(&add);
	CLACT_SetAnmFlag(scene->Rival,0);
	CLACT_SetDrawFlag(scene->Rival, 0);	//非表示
	CLACT_AnmChg( scene->Rival, ANM_NO_RIVAL );

	//ミナキ
	OPD_MakeClActHeader( ACT_ID_S3_MINA_ANN, wk, 0, NNS_G2D_VRAM_TYPE_2DSUB, &add, &cl_act_header );
	add.mat.x = FX32_ONE * MINAKI_DEF_POS_X;
	add.mat.y = FX32_ONE * MINAKI_DEF_POS_Y;
	scene->Minaki = CLACT_Add(&add);
	CLACT_SetAnmFlag(scene->Minaki,0);
	CLACT_SetDrawFlag(scene->Minaki, 0);	//非表示
	CLACT_AnmChg( scene->Minaki, ANM_NO_MINAKI );
#endif
}